home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / bin / pysupport-movemodules < prev    next >
Text File  |  2007-05-08  |  4KB  |  117 lines

  1. #! /usr/bin/python
  2. #
  3. # copyright (c) 2006 Josselin Mouette <joss@debian.org>
  4. # Licensed under the GNU Lesser General Public License, version 2.1
  5. # See COPYING for details
  6.  
  7. from optparse import OptionParser
  8. import os,os.path,md5,re,sys
  9.  
  10. sourcepath='usr/share/python-support'
  11. extensionpath='usr/lib/python-support'
  12.  
  13. parser = OptionParser(usage="usage: %prog [options] [directory [...]]")
  14.  
  15. parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
  16.                   help="verbose output", default=False)
  17. parser.add_option("-p", "--package", dest="package")
  18.  
  19. (options, args) = parser.parse_args()
  20.  
  21. sys.path.append("/usr/lib/python-support/private/")
  22. from pysupport import py_supported,py_supported_short
  23.  
  24. # Set the umask so that directories are created with correct permissions
  25. os.umask(022)
  26.  
  27. if not args:
  28.   parser.error("No directory to process.")
  29.  
  30. for basedir in args:
  31.   if not os.path.isdir(basedir):
  32.     parser.error("%s is not a directory."%basedir)
  33.  
  34. class filelist:
  35.   def __init__(self):
  36.     self.d={}
  37.     self.pylist=[]
  38.   def addsum(self,file,pyver,sum):
  39.     if file not in self.d:
  40.       self.d[file]={}
  41.     self.d[file][pyver]=sum
  42.   def addpyver(self,pyver):
  43.     self.pylist.append(pyver)
  44.   def isallthesame(self,file):
  45.     if file.endswith(".so"):
  46.       # If there is a .so, no need to even check, it must be moved
  47.       return False
  48.     elif re.search('\.so(?:\.\d+){0,3}$', file):
  49.       print "%s: this shared object should not be versioned"%file
  50.       return False
  51.     try:
  52.       s=[ self.d[file][pyver] for pyver in self.pylist ]
  53.     except KeyError:
  54.       return False
  55.     return (s.count(s[0]) == len(self.pylist))
  56.   def list(self,file):
  57.     return self.d[file].keys()
  58.   def __iter__(self):
  59.     return iter(self.d)
  60.  
  61. def do_move (basedir, package, pybasedir, suffixdir=""):
  62.   file_dict=filelist()
  63.   for pyvers in py_supported:
  64.     pydir=os.path.join(basedir,pybasedir,pyvers,suffixdir)
  65.     if not os.path.isdir(pydir):
  66.       continue
  67.     file_dict.addpyver(pyvers)
  68.     for dir, dirs, files in os.walk(pydir):
  69.       reldir = dir[len(pydir):].lstrip('/')
  70.       for curfile in files:
  71.         relfile = os.path.join(reldir,curfile)
  72.         absfile = os.path.join(pydir,relfile)
  73.         # remove bytecompiled files and libtool cruft
  74.         if relfile.split('.')[-1] in ["pyc", "pyo", "a", "la"]:
  75.           os.remove(absfile)
  76.         else:
  77.           file_dict.addsum(relfile,pyvers,md5.new(file(absfile).read()).digest())
  78.  
  79.   for relfile in file_dict:
  80.     splitfile=not file_dict.isallthesame(relfile)
  81.     destdir=os.path.join(sourcepath,package)
  82.     for pyver in file_dict.list(relfile):
  83.       sourcefile=os.path.join(basedir,pybasedir,pyver,suffixdir,relfile)
  84.       if splitfile:
  85.         destdir=os.path.join(extensionpath,package,pyver)
  86.       os.renames(sourcefile,os.path.join(basedir,destdir,relfile))
  87.  
  88. # Remove the -py$(VERSION) part of the egg directories
  89. def do_eggrename (basedir, package, pybasedir, suffixdir=""):
  90.   for vers in py_supported_short:
  91.     pydir=os.path.join(basedir,pybasedir,"python"+vers,suffixdir)
  92.     suffix="-py"+vers+".egg-info"
  93.     if not os.path.isdir(pydir):
  94.       continue
  95.     for item in os.listdir(pydir):
  96.       item=os.path.join(pydir,item)
  97.       if os.path.isdir(item) and item.endswith(suffix):
  98.        new_item = item[:-len(suffix)]+".egg-info"
  99.        if not os.path.exists(new_item): # You never know
  100.          os.rename(item, new_item)
  101.  
  102. for basedir in args:
  103.   basedir=basedir.rstrip('/')
  104.   package=options.package
  105.   if not package:
  106.     package=os.path.split(basedir)[1]
  107.   if not package:
  108.     raise "Unable to extract the package name."
  109.   do_eggrename (basedir, package, "usr/lib", "site-packages")
  110.   do_move (basedir, package, "usr/lib", "site-packages")
  111.   do_eggrename (basedir, package, "var/lib/python-support")
  112.   do_move (basedir, package, "var/lib/python-support")
  113.  
  114.   # Handle the case when there are only .so files
  115.   if os.path.isdir(os.path.join(basedir,extensionpath)) and not os.path.isdir(os.path.join(basedir,sourcepath,package)):
  116.     os.makedirs(os.path.join(basedir,sourcepath,package))
  117.